import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, roc_auc_score
#解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']




def preprocess_data(data, feature_columns=None):
    """安全的数据预处理函数"""
    # 一次性生成所有独热编码列
    columns_to_encode = ['EducationField', 'BusinessTravel', 'Department',
                         'Gender', 'JobRole', 'MaritalStatus', 'OverTime']
    dummies = pd.get_dummies(data[columns_to_encode], prefix=columns_to_encode)
    processed = pd.concat([data, dummies], axis=1)

    # 安全删除不需要的列
    cols_to_drop = columns_to_encode + [
        'OverTime_No', 'Gender_Female', 'StandardHours', 'Over18', 'EmployeeNumber'
    ]
    for col in cols_to_drop:
        if col in processed.columns:
            processed = processed.drop(columns=col, errors='ignore')

    # 特征对齐逻辑
    if feature_columns:
        # 保留目标列（如果存在）
        keep_columns = feature_columns.copy()
        if 'Attrition' in processed.columns:
            keep_columns += ['Attrition']

        # 重建DataFrame
        processed = processed.reindex(columns=keep_columns, fill_value=0)

    return processed


def plot_auc_curve(y_true, y_pred_prob, dataset_name="", save_path=None):
    """
    绘制AUC-ROC曲线并保存图像[9,11](@ref)
    参数:
        y_true: 真实标签
        y_pred_prob: 预测概率值（正类概率）
        dataset_name: 数据集名称（用于标题）
        save_path: 图像保存路径
    返回:
        auc_value: AUC值
    """
    # 计算ROC曲线参数
    fpr, tpr, thresholds = roc_curve(y_true, y_pred_prob)
    auc_value = auc(fpr, tpr)

    # 创建图形
    plt.figure(figsize=(10, 8))
    plt.plot(fpr, tpr, color='darkorange', lw=2,
             label=f'ROC曲线 (AUC = {auc_value:.4f})')
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.fill_between(fpr, tpr, color='blue', alpha=0.1)  # AUC面积填充[9](@ref)
    plt.xlim([-0.02, 1.02])
    plt.ylim([-0.02, 1.05])
    plt.xlabel('假阳性率 (FPR)', fontsize=12)
    plt.ylabel('真阳性率 (TPR)', fontsize=12)
    title = f'{dataset_name} ROC曲线' if dataset_name else 'ROC曲线'
    plt.title(title, fontsize=14)
    plt.legend(loc="lower right", fontsize=12)
    plt.grid(True, alpha=0.3)

    # 保存或显示图像
    if save_path:
        plt.savefig(save_path, bbox_inches='tight')
        # print(f"AUC曲线已保存至: {save_path}")
    else:
        plt.show()

    plt.close()
    return auc_value